package com.jishuo.pzk.util;

import com.google.gson.Gson;
import com.jishuo.pzk.bean.base.VoucherCX;
import com.jishuo.pzk.bean.base.VoucherTypeVO;
import com.jishuo.pzk.bean.base.VoucherVO;
import com.jishuo.pzk.service.VoucherService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;


/**
 * @Author: 姚炜琦
 * @Email: jingcaiqi1225@gmail.com
 * @Date: 2023/8/30 17:03
 * @Package: com.jtyh.utils
 * @NAME: VoucherUtil
 * @Description: 凭证公共业务处理类
 */
@Component
@Slf4j
public class VoucherUtil {

    @Autowired
    private VoucherService voucherService;

    /**
     * @param type        业务类型
     * @param orderBillSn 订单流水号
     * @param code        业务类型对应编码
     * @param billNum     单据票号
     * @param voType      凭证类型
     * @param step        步骤
     * @param cantonId    区划id
     * @param bankId      银行id
     * @param writeTime   写入事件
     * @param bankStation 银行网点
     * @param payBankDt   付款日期
     * @return 凭证类型对象
     */
    public VoucherVO getVoucher(Integer type, String orderBillSn, String code, String billNum, String voType, String step, String cantonId, String bankId, String writeTime, String bankStation, String payBankDt, String voucher) {
        VoucherVO voucherVO = new VoucherVO();

        String VO_SN = IdWorker.getOrderCode(type);
        voucherVO.setVoSn(VO_SN);
        if (orderBillSn.equals("0")) {
            String ORDERBILLSN = IdWorker.getOrderCode(type);
            // 订单流水号
            voucherVO.setOrderbillsn(ORDERBILLSN);
        } else {
            // 订单流水号
            voucherVO.setOrderbillsn(orderBillSn);
        }

        // 单编号《凭证号)
        voucherVO.setBusiorderno(billNum);

        if (voType.equals("0")) {
            // 根据凭证类型查询凭证类型对象
            VoucherTypeVO vto = voucherService.getVoucherType(code);
            // 凭证类型(FS_VOUCHER_TYPE外键)
            voucherVO.setVoType(vto.getId());
        } else {
            // 凭证类型 (FS_VOUCHER_TYPE键)
            voucherVO.setVoType(voType);
        }

        // 凭证步骤 (1- 开票凭证 2-收款凭证 3-对账凭证) 与凭证联页有关
        voucherVO.setVoStep(step);
        // 是否已对账(0-来对 1-已对)
        voucherVO.setIsRecon("0");
        // 区划id
        if (cantonId == null) {
            voucherVO.setAdmdiv(0);
        } else {
            voucherVO.setAdmdiv(Integer.parseInt(cantonId));
        }

        // 可用状态 0-暂存 1-正常 2-停用 3-正常作废 4-过期作废 -1-删除
        voucherVO.setIsenable(1);

        voucherVO.setBusitype(type);

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat formatY = new SimpleDateFormat("yyyy");

        if (writeTime.equals("0")) {
            // 填制日期
            voucherVO.setWritedate(format.format(new Date()));
            // 录入日期
            voucherVO.setEntryDate(format.format(new Date()));
        } else {
            // 填制日期
            voucherVO.setWritedate(writeTime);
            // 录入日期
            voucherVO.setEntryDate(writeTime);
        }

        // 银行id
        voucherVO.setBankid(bankId);
        // 是否验签成功
        voucherVO.setIsverify(1);
        // 数据类型
        voucherVO.setDatatype(0);
        // 年份
        voucherVO.setYear(formatY.format(new Date()));
        // 网点名称
        voucherVO.setBankstation(bankStation);
        // 收款日期
        voucherVO.setPaybankdt(payBankDt);
        // 原始报文
        voucherVO.setVoucher(voucher);
        return voucherVO;
    }

    /**
     * 使用给定的数据冲销票据。
     *
     * @param data 包含票据信息的JSON字符串，用于解析后获取票据参数。
     * @return 冲销结果，成功返回1，失败返回0。
     */
    public int voucherElimination(String data) {

        // 从JSON字符串解析出VoucherCX对象
        VoucherCX cx = new Gson().fromJson(data, VoucherCX.class);

        // 根据解析出的参数查找对应的票据
        VoucherVO vo = voucherService.findVoucher(cx.getBiliNum(), cx.getType());

        // 如果找到了相应的票据，则尝试更新票据的启用状态
        if (null != vo) {
            // 更新成功则记录日志并返回1，表示冲销成功
            if (voucherService.updateVoucherIsEnableThree(cx.getBiliNum(), String.valueOf(cx.getType()), vo.getVoSn()) > 0) {
                log.info("票据冲销成功，该票据参数为： 票号 - " + cx.getBiliNum() + "SN - " + vo.getVoSn() + "票据类型 - " + cx.getType());
                return 1;
            }
        }
        // 更新失败或未找到票据，则记录日志并返回0，表示冲销失败
        log.info("票据冲销失败，该票据参数为： 票号 - " + cx.getBiliNum() + "票据类型 - " + cx.getType());
        return 0;
    }
}